package com.xy.tianyu.utils

import com.blankj.utilcode.util.ObjectUtils
import java.math.BigDecimal
import java.math.RoundingMode
import java.text.DecimalFormat
import java.text.NumberFormat

/**
 * @author xie
 * @time 2018/11/5 16:28
 * @class 描述:
 */
object DoubleUtils {
    /**
     * double 相加
     * @param d1
     * @param d2
     * @return
     */
    fun sum(d1: Double, d2: Double): Double {
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.add(bd2).toDouble()
    }

    /**
     * double 相减
     * @param d1
     * @param d2
     * @return
     */
    fun sub(d1: Double, d2: Double): Double {
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.subtract(bd2).toDouble()
    }

    /**
     * double 乘法
     * @param d1
     * @param d2
     * @return
     */
    fun mul(d1: Double, d2: Double): Double {
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.multiply(bd2).toDouble()
    }

    /**
     * double 除法
     * @param d1
     * @param d2
     * @param scale 四舍五入 小数点位数
     * @return
     */
    fun div(d1: Double, d2: Double, scale: Int): Double {
        //  当然在此之前，你要判断分母是否为0，
        //  为0你可以根据实际需求做相应的处理
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP).toDouble()
    }

    /**
     * double 转 string 去掉后面锝0
     * @param i
     * @return
     */
    fun getString(i: Double): String {
        var s = i.toString()
        if (s.indexOf(".") > 0) {
            //正则表达
            s = s.replace("0+?$".toRegex(), "") //去掉后面无用的零
            s = s.replace("[.]$".toRegex(), "") //如小数点后面全是零则去掉小数点
        }
        return s
    }

    @JvmStatic
    fun main(args: Array<String>) {
        val i = numberToBits("10000000.01")
        println(i)
    }

    /**
     * 数字转换为千位符
     * @param number
     * @return
     */
    fun numberToBits(number: String): String {
        var begin = ""
        var end = ""
        val num = number.split("\\.".toRegex()).toTypedArray()
        if (num.size > 1) {
            begin = num[0]
            end = num[1]
        } else {
            begin = number
        }
        return begin.replace("(?<=\\d)(?=(?:\\d{3})+$)".toRegex(), ",") + "." + end
    }

    /**
     * 保留两位小数，四舍五入的一个老土的方法
     * @param d
     * @return
     */
    fun formatDouble1(d: Double): Double {
        return Math.round(d * 100).toDouble() / 100
    }

    /**
     * The BigDecimal class provides operations for arithmetic, scale manipulation, rounding, comparison, hashing, and format conversion.
     * @param d
     * @return
     */
    fun formatDouble2(d: Double): Double {
        // 旧方法，已经不再推荐使用
//        BigDecimal bg = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);


        // 新方法，如果不需要四舍五入，可以使用RoundingMode.DOWN
        val bg =
            BigDecimal(d).setScale(2, RoundingMode.UP)
        return bg.toDouble()
    }

    /**
     * 保留一位小数
     * @param d
     * @return
     */
    fun formatDoubleOne(d: Double): Double {
        // 旧方法，已经不再推荐使用
//        BigDecimal bg = new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP);


        // 新方法，如果不需要四舍五入，可以使用RoundingMode.DOWN
        val bg =
            BigDecimal(d).setScale(1, RoundingMode.DOWN)
        return bg.toDouble()
    }

    /**
     * NumberFormat is the abstract base class for all number formats.
     * This class provides the interface for formatting and parsing numbers.
     * @param d
     * @return
     */
    fun formatDouble3(d: Double): String {
        val nf = NumberFormat.getNumberInstance()


        // 保留两位小数
        nf.maximumFractionDigits = 2


        // 如果不需要四舍五入，可以使用RoundingMode.DOWN
        nf.roundingMode = RoundingMode.DOWN
        return nf.format(d)
    }

    /**
     * 这个方法挺简单的。
     * DecimalFormat is a concrete subclass of NumberFormat that formats decimal numbers.
     * @param d
     * @return
     */
    fun formatDouble4(d: Double): String {
        val df = DecimalFormat("#.00")
        df.roundingMode = RoundingMode.DOWN
        return df.format(d)
    }

    /**
     * 如果只是用于程序中的格式化数值然后输出，那么这个方法还是挺方便的。
     * 应该是这样使用：System.out.println(String.format("%.2f", d));
     * @param d
     * @return
     */
    fun formatDouble5(d: Double): String {
        return String.format("%.2f", d)
    }

    /**
     * 获取两个相加后保留两位数(四舍五入)的字符串
     * @return
     */
    fun getDouble2StringSum(d1: Double, d2: Double): String {
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.add(bd2).setScale(2, RoundingMode.UP).toString()
    }

    /**
     * 获取两个相减后保留两位数(四舍五入)的字符串
     * @return
     */
    fun getDouble2StringSub(d1: Double, d2: Double): String {
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.subtract(bd2).setScale(2, RoundingMode.UP).toString()
    }

    /**
     * 获取两个相乘后保留两位数(四舍五入)的字符串
     * @param d1
     * @param d2
     * @return
     */
    fun getDouble2StringMul(d1: Double, d2: Double): String {
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.multiply(bd2).setScale(2, RoundingMode.UP).toString()
    }

    /**
     * 获取两个相除后保留两位数(四舍五入)的字符串
     * @param d1
     * @param d2
     * @return
     */
    fun getDouble2StringDiv(d1: Double, d2: Double): String {
        //  当然在此之前，你要判断分母是否为0，
        //  为0你可以根据实际需求做相应的处理
        val bd1 = BigDecimal(java.lang.Double.toString(d1))
        val bd2 = BigDecimal(java.lang.Double.toString(d2))
        return bd1.divide(bd2).setScale(2, RoundingMode.UP).toString()
    }

    /**
     * 使用java正则表达式去掉多余的.与0
     * @param s
     * @return
     */
    fun subZeroAndDot(s: String): String {
        var s = s
        if (ObjectUtils.isEmpty(s)) {
            return ""
        }
        if (s.indexOf(".") > 0) {
            s = s.replace("0+?$".toRegex(), "") //去掉多余的0
            s = s.replace("[.]$".toRegex(), "") //如最后一位是.则去掉
        }
        return s
    }
}